const express = require('express')
const cors = require('cors')
const helmet = require('helmet')
const rateLimit = require('express-rate-limit')
require('dotenv').config()
const errorHandler = require('./src/middleware/errorHandler')
const swaggerUi = require('swagger-ui-express')
const swaggerJsdoc = require('swagger-jsdoc')

const app = express()

// Swagger JSDoc 配置
const swaggerOptions = {
  definition: {
    openapi: '3.0.0',
    info: {
      title: '在线考试系统 API 文档',
      version: '1.0.0',
      description: '这是在线考试系统后端的 API 文档，使用 Swagger 生成。',
      contact: {
        name: 'API 支持',
        url: 'http://yourdomain.com/support', // 替换为你的支持URL
        email: '2336558626@qq.com', // 替换为你的支持邮箱
      },
    },
    servers: [
      {
        url: `http://localhost:${process.env.PORT || 3000}`,
        description: '开发服务器',
      },
      // 你可以添加更多服务器，例如生产服务器
      // {
      //   url: 'https://yourdomain.com',
      //   description: '生产服务器',
      // }
    ],
    components: {
      // 定义可重用的组件，例如安全方案
      securitySchemes: {
        bearerAuth: {
          // 定义一个名为 bearerAuth 的安全方案
          type: 'http',
          scheme: 'bearer',
          bearerFormat: 'JWT', // JWT token
        },
      },
    },
    security: [
      // 全局应用安全方案 (如果所有或大部分API都需要认证)
      {
        bearerAuth: [], // 应用上面定义的 bearerAuth
      },
    ],
  },
  // 指向包含 API 定义的路由文件 (使用 JSDoc 注释)
  apis: ['./src/routes/*.js'],
}

const swaggerSpec = swaggerJsdoc(swaggerOptions)

// 安全中间件
app.use(helmet())

// 限流中间件
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 1000, // 限制每个IP 15分钟内最多1000个请求
  message: '请求过于频繁，请稍后再试',
})
app.use(limiter)

// CORS配置
app.use(
  cors({
    origin:
      process.env.NODE_ENV === 'production'
        ? ['https://yourdomain.com']
        : [
            'http://localhost:5173',
            'http://localhost:3000',
            `http://localhost:${process.env.PORT || 3000}`,
          ], // 允许你的前端开发服务器和可能的API测试工具
    credentials: true,
  })
)

// 解析中间件
app.use(express.json({ limit: '10mb' }))
app.use(express.urlencoded({ extended: true, limit: '10mb' }))

// API 文档路由 (通常放在所有 API 路由之前或一个容易访问的地方)
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec))

// 路由
app.use('/api/auth', require('./src/routes/auth'))
app.use('/api/users', require('./src/routes/user'))
app.use('/api/exams', require('./src/routes/exam'))
app.use('/api/questions', require('./src/routes/question'))
app.use('/api/records', require('./src/routes/record'))

// 健康检查
app.get('/health', (req, res) => {
  res.json({ status: 'OK', timestamp: new Date().toISOString() })
})

// 404处理
app.use('*', (req, res) => {
  res.status(404).json({ message: 'API路径不存在' })
})

// 错误处理中间件
app.use(errorHandler)

const PORT = process.env.PORT || 3000
app.listen(PORT, () => {
  console.log(`🚀 服务器运行在端口 ${PORT}`)
  console.log(`📊 环境: ${process.env.NODE_ENV}`)
  console.log(`📚 API 文档地址: http://localhost:${PORT}/api-docs`) // 添加 API 文档地址的日志输出
})
